/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.xuexiang.xui_lib.component.imageview.crop;

import ohos.aafwk.ability.DataAbilityHelper;
import ohos.aafwk.ability.DataAbilityRemoteException;
import ohos.app.Context;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;
import ohos.media.image.common.PixelFormat;
import ohos.media.image.common.Rect;
import ohos.media.image.common.Size;
import ohos.media.photokit.metadata.AVStorage;
import ohos.utils.net.Uri;

import java.io.FileDescriptor;
import java.io.FileNotFoundException;

/**
 * @since 2021-03-31
 */
public class CropDrawableUtils {
    /**
     * 安全的创建bitmap。
     * 如果新建 Bitmap 时产生了 OOM，可以主动进行一次 GC - System.gc()，然后再次尝试创建。
     *
     * @param source 原图片
     * @param x 源中第一个像素的x坐标
     * @param y 源中第一个像素的y坐标
     * @param width 一行像素点的数量
     * @param height 行数
     * @param retryCount 创建 Bitmap 时产生 OOM 后，主动重试的次数。
     * @return 返回创建的 Bitmap。
     */
    public static PixelMap createBitmapSafely(PixelMap source, int x, int y, int width, int height, int retryCount) {
        if (x < 0 || y < 0 || width <= 0 || height <= 0) {
            return null;
        }
        try {
            Rect srcRegion = new Rect(x, y, width, height);
            PixelMap.InitializationOptions opt = new PixelMap.InitializationOptions();
            opt.size = new Size(width, height);
            return PixelMap.create(source, srcRegion, opt);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return null;
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            if (retryCount > 0) {
                System.gc();
                return createBitmapSafely(source, x, y, width, height, retryCount - 1);
            }
            return null;
        }
    }

    /**
     * 安全的创建PixelMap
     * 如果新建 PixelMap 时产生了 OOM，可以主动进行一次 GC - System.gc()，然后再次尝试创建。
     *
     * @param source source。
     * @param width PixelMap 宽度。
     * @param height PixelMap 高度。
     * @param config 传入一个 PixelFormat.Config。
     * @param retryCount 创建 PixelMap 时产生 OOM 后，主动重试的次数。
     * @return 返回创建的 PixelMap。
     */
    public static PixelMap createBitmapSafely(PixelMap source, int width, int height, PixelFormat config, int retryCount) {
        //width and height must be > 0
        if (width <= 0 || height <= 0) {
            return null;
        }
        try {
            PixelMap.InitializationOptions opts = new PixelMap.InitializationOptions();
            opts.pixelFormat = config;
            opts.size = new Size(width, height);
            return PixelMap.create(source, opts);
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            if (retryCount > 0) {
                System.gc();
                return createBitmapSafely(source, width, height, config, retryCount - 1);
            }
            return null;
        }
    }

    /**
     * 根据图片uri 创建FileDescriptor
     *
     * @param context 上下文。
     * @param imgUri 图片路径。
     * @return 返回创建的 FileDescriptor 不存在返回null。
     */
    public static FileDescriptor displayPic(Context context, Uri imgUri) {
        DataAbilityHelper helper = DataAbilityHelper.creator(context);
        try {
            String id = imgUri.getLastPath().indexOf("image:") != -1 ? imgUri.getLastPath().replace("image:", "") : imgUri.getLastPath();
            Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, "" + id);
            FileDescriptor filedesc = helper.openFile(uri, "r");
            return filedesc;
        } catch (DataAbilityRemoteException | FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据图片uri 创建PixelMap
     *
     * @param context 上下文。
     * @param imgUri 图片路径。
     * @return 返回创建的 PixelMap。不存在返回null。
     */
    public static PixelMap displayPixelMap(Context context, Uri imgUri) {
        DataAbilityHelper helper = DataAbilityHelper.creator(context);
        String id = imgUri.getLastPath().indexOf("image:") != -1 ? imgUri.getLastPath().replace("image:", "") : imgUri.getLastPath();
        Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, id+"");
        FileDescriptor filedesc = null;
        try {
            filedesc = helper.openFile(uri, "r");
            ImageSource imageSource = ImageSource.create(filedesc, null);
            PixelMap pixelMap = imageSource.createPixelmap(null);
            return pixelMap;
        } catch (DataAbilityRemoteException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;

    }
}
